export {}
// 键值类型语法
// { [key: KeyType]: ValueType }
// 注意在键值语法中KeyType类型只能是string、number、symbol或则模板字面量  不能是纯字面量

// 错误例子
interface Dictionary {
  [key: boolean]: string;// 错误  keyType不能是boolean
};

// 模板字面量例子
interface ProChangeHandler {
  [key: `${string}Changed`]: () => void;// 正确
};
let handlers: ProChangeHandler = {
  idChanged: () => { },
  nameChanged: () => { },
  ageChange: () => { }, // 错误  不符合模板字面量规定的格式  少一个字符d
}

// keyType是string类型时中括号取值
interface NumberNams {
  [key: string]: string;
}
let names: NumberNams = {
  '1': 'name',
  2: 'age', // 正确 在对象中属性都会经过隐式转换变成 string
};
const name = names['1']; // 正确
const name2 = names[1]; // 正确 会经过隐式转换变成 string

type N0 = keyof NumberNams; // 注意结果是 string ｜ number，这说明由于隐式转换的作用在keyType中 string、number类型是兼容的

// 使用字面量的错误例子
interface User1 {
  [key: 'id']: string; // 错误 keyType不允许是字面量类型
}

interface User2 {
  [key: 'id' | 'age']: string; // 错误 keyType不允许是字面量类型
}

// 解决以上问题可以如果Record这个工具类型
type User3 = Record<'id', string>; // 正确
type User4 = Record<'id' | 'age', string>; // 正确